package tk.mynoteapp.dev.demo04.jedis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

/**
 * 注意鉴别客户端 SDK 是否基于连接池
 * 【 客户端 <--[获得/归还]--> 连接池 】 --[创建链接]--> 服务端
 *
 * 连接池：
 *   - 连接池配置（最小空闲、最大连接等）
 *   - 可用连接
 *   - 已用连接
 *   - 连接保活、空闲连接回收器、可用性检测器
 *
 * 注意鉴别客户端 SDK 是否基于连接池
 *
 * SDK三种连接的类型
 *   - 分离式（分为客户端和连接池，并且连接池式线程安全的，单独使用客户端非线程安全，例如：jedis）
 *   - 内置式（连接池内置，客户端调用API无需手动获取和归还，由SDK负责管理）
 *   - 不提供连接池（非线程安全，需要考虑自己封装，可以使用apache的commons-pool2-2.8.0.jar包GenericObjectPool）
 */
@RestController
@RequestMapping("jedismissreuse")
public class JedisMissReuseController {
    private Logger logger = LoggerFactory.getLogger(JedisMissReuseController.class);

//    private static JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//
//    @PostConstruct
//    public void init() {
//        try (Jedis jedis = new Jedis("127.0.0.1", 6379)) {
//            Assert.isTrue("OK".equals(jedis.set("a", "1")), "set a = 1 return OK");
//            Assert.isTrue("OK".equals(jedis.set("b", "2")), "set b = 2 return OK");
//        }
//        // 程序退出之前关闭jedisPool连接池
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
//            jedisPool.close();
//        }));
//    }
//
//    @GetMapping("/wrong")
//    public void wrong() throws InterruptedException {
//        Jedis jedis = new Jedis("127.0.0.1", 6379);
//        new Thread(() -> {
//            for (int i = 0; i < 1000; i++) {
//                String result = jedis.get("a");
//                if (!"1".equals(result)) {
//                    logger.warn("Expect a to be 1 but found {}", result);
//                    return;
//                }
//            }
//        }).start();
//        new Thread(() -> {
//            for (int i = 0; i < 1000; i++) {
//                String result = jedis.get("b");
//                if (!"2".equals(result)) {
//                    logger.warn("Expect b to be 2 but found {}", result);
//                    return;
//                }
//            }
//        }).start();
//        TimeUnit.SECONDS.sleep(5);
//    }
//
//    @GetMapping("/right")
//    public void right() throws InterruptedException {
//        new Thread(() -> {
//            try (Jedis jedis = jedisPool.getResource()) {
//                for (int i = 0; i < 1000; i++) {
//                    String result = jedis.get("a");
//                    if (!"1".equals(result)) {
//                        logger.warn("Expect a to be 1 but found {}", result);
//                        return;
//                    }
//                }
//            }
//
//        }).start();
//        new Thread(() -> {
//            try (Jedis jedis = jedisPool.getResource()) {
//                for (int i = 0; i < 1000; i++) {
//                    String result = jedis.get("b");
//                    if (!"2".equals(result)) {
//                        logger.warn("Expect b to be 2 but found {}", result);
//                        return;
//                    }
//                }
//            }
//        }).start();
//        TimeUnit.SECONDS.sleep(2);
//    }
}
